package com.knowledge.plus.泛型.通配符;

import java.util.List;

/**
 * 上界通配符 <? extends T>
 *     - 可以读：可以从使用上界通配符的集合中读取数据，这些数据限定为类型 T 及其子类型
 *     - 不能写：不能向使用上界通配符的集合中写入除 null 外的任何具体类型的对象，以保证类型安全
 * 下界通配符 <? super T>
 *     - 可以写：可以向使用下界通配符的集合中写入类型 T 及其父类型的数据
 *     - 不能读：从使用下界通配符的集合中读取数据时，只能将其视为 Object 类型，因为具体类型未知
 *
 * @author TPF
 * @since 2023/7/27
 */
public class GenericTypeDemo {

    /**
     * 对于<? extends 类型>，编译器将只允许读操作，不允许写操作。即只可以取值，不可以设值
     * 对于<? super 类型>，编译器将只允许写操作，不允许读操作。即只可以设值（比如 set 操作），不可以取值（比如 get 操作）
     */
    // 把 src 的每个元素复制到 dest 中:
    public static <T> void copy(List<? super T> dest, List<? extends T> src) {
        for (int i = 0; i < src.size(); i++) {
            // 获取 src 集合中的元素，并赋值给变量 t，其数据类型为 T
            T t = src.get(i);
            // 将变量 t 添加进 dest 集合中
            dest.add(t);
        }
    }

}
